HMAC (Hash-Based Message Authentication Code)

암호화 랑은 약간 느낌이 다른다. 암호화는 평문을 암호문으로 만든 후 (암호화), 다시 평문으로 만들 때 (복호화) 키가 필요하다. HMAC 은 메시지 + 비밀키(Sealed secret) 을 해싱하여(e.g base64) 고정 길이 서명 문으로 만든다. HMAC 은 메시지가 변조되지 않았음을 증명하기 위해 사용된다. 그리고 암호화랑 달리 복호화가 불가능하다. (이걸 일방향 함수라 하나봄)

구분설명
message검증하고 싶은 데이터 (userID, event etc)
key비밀 키 (서버만 알고 있음, sealed secret 으로 보호)
HMAC 결과메시지의 ‘디지털 서명’
복호화불가 (일방향 함수: 암호화만 가능함)
용도데이터 무결성 검증, 위조 방지

내가 이벤트를 참여함 (eventID: 1234, userID: 300)

이 두 값을 key 와 함께 암호화해서 HMAC 결과를 낸다. 이걸 검증하고자 하는 곳에 보냄.

다른곳에서 내가 이벤트 참여한걸 검증하기 위해선 세가지 값을 알아야 함.

참여한 eventID, userID, 그리고 key 값. 이 세 가지 값을 가지고 똑같이 HMAC 결과를 낸다.

두 HMAC 서명문을 비교하여 값이 같으면 검증 성공이고, 다르면 위조된 값이라 판단함.

예시


key := "mysecretkey123"

message1 := "user_id:100:timestamp:1234567890"
message2 := "user_id:100:timestamp:1234567890"  // 같은 메시지
message3 := "user_id:999:timestamp:1234567890"  // 다른 메시지

// 같은 key + 같은 message = 같은 서명
computeHMAC(key, message1)
// → "x8Kj2L5mN9pQ..."

computeHMAC(key, message2)
// → "x8Kj2L5mN9pQ..."  (동일!)

// 같은 key + 다른 message = 다른 서명
computeHMAC(key, message3)
// → "a1B2c3D4e5F6..."  (완전히 다름!)

// 다른 key + 같은 message = 다른 서명
computeHMAC("wrongkey", message1)
// → "z9Y8x7W6v5U4..."  (완전히 다름!)

공격 시나리오:


원본 요청:

userId: 100
eventId: lucky_draw
checksum: "K7s9D2f4H6j8..." (서버가 생성)

공격자가 변조 시도:

userId: 999  ← 변조!
eventId: lucky_draw
checksum: "K7s9D2f4H6j8..." (그대로 사용)

서버 검증:

expectedChecksum = HMAC(key, "999:lucky_draw")
→ "X1y2Z3a4B5c6..." (다름!)

expectedChecksum != receivedChecksum
→ 🚫 요청 거부!

Checksum과의 관계 (HMAC = 보안 강화된 checksum)

Checksum 이 무엇이냐? 데이터가 전송되는 동안 값이 온전히 보장되는지 확인하기 위한 중복 검사의 형태로, 공간(전자 통신)이나 시간(기억 장치)속에서 송신된 자료의 무결성을 보호하는 단순한 방법이다. check + sum : 초기 체크섬 알고리즘(ex, LRC, BCC) 은 실제로 데이터 바이트를 단순히 더해서(sum) 만들어낸 값이었기 때문에 checksum 이라는 말이 탄생했다.

데이터가 손상되었는지 확인하기 위해 계산한 합(값)


  • 파일 전송이나 네트워크 패킷에서 사용
  • 단순 데이터 변형 여부만 확인
  • 키가 없음 → 누구든 쉽게 위조 가능

즉 checksum 은 단순 오류(전송 중 데이터 잘못 보내는 등)는 잡아내지만 **의도적인 공격(값 변조)**는 막지 못한다.


HMAC = “비밀키가 포함된 보안용 checksum”

HMAC 과 checksum 은 비슷해 보이지만 서로 개념은 다르다.

항목일반 checksumHMAC
목적전송 중 오류 감지위조 방지 + 데이터 무결성 검증
비밀키 사용❌ 없음✔️ 있음
공격자 위조 가능?가능매우 어려움 (비밀키를 모르면 재생 불가)
보안 수준낮음매우 높음

checksum 은 단순 무결성 검사, HMAC 은 보안이 강화된 checksum(=서명) 으로 볼 수 있다.

실제로 HMAC 결과를 “checksum” 이라고 부르는 서비스들도 많다. 엄밀한 의미로는 HMAC = 암호학적 메시지 인증 코드(Crypto-MAC) 이고 일반 checksum 보다 훨씬 안전하다.